﻿#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>
//#include"Add.h"

//int rand = 0;

//namespace bit
//{
//	int rand = 0;
//
//	int add(int num1, int num2)
//	{
//		return num1 + num2;
//	}
//
//	struct Node
//	{
//		int val;
//		struct Node* next;
//	};
//}
// 
//namespace bit2
//{
//	int rand = 0;
//
//	int add(int num1, int num2)
//	{
//		return num1 + num2;
//	}
//
//	struct Node
//	{
//		int val;
//		struct Node* next;
//	};
//}

//int main()
//{
//	//printf("rand = %d", rand);
//	//int ret1 = bit::add(1, 2);
//	//printf("bit->add(1,2) = % d\n", ret1);
//
//	//int ret2 = bit2::add(1, 2);
//	//printf("bit2->add(1,2) = % d\n", ret2);
//
//	return 0;
//}

//namespace bit
//{
//	int rand = 0;
//
//	namespace s
//	{
//		int rand = 1;
//	}
//}

//int main()
//{
//	//printf("rand = %d\n", bit::s::rand);
//
//	//int ret = bit::Add(1, 2);
//	//printf("ret = %d\n", ret);
//
//	return 0;
//}

//int num = 0;

//namespace bit
//{
//	int num = 1;
//}
//using namespace bit;


//namespace bit2
//{
//	int num = 2;
//}
////using namespace bit2;
////using  bit2::num;
//
//int main()
//{
//	printf("num = %d\n", bit2::num);
//	
//	return 0;
//}

//namespace A
//{
//	int count = 0;
//}
//
//int main()
//{
//	int count = 1;
//	printf("命名空间count:%d\n", A::count);
//	printf("main函数count:%d\n", count);
//	return 0;
//}

//int count = 0;
//
//int main()
//{
//	int count = 1;
//	printf("局部变量count:%d\n", count);
//	printf("全局变量count:%d\n", ::count);
//	return 0;
//}
//
#include<iostream>
using namespace std;
//int main()
//{
//	int num;
////将想要输入/输出的数据放到流插入/流输出运算符后面就可以
//	cout << "请输入一个整数" << endl;
//	cin >> num;
//	cout << num << endl;
//	return 0;
//}

//// 定义形参时直接给变量赋值，这个值叫缺省值
//// 当函数调用未传参时就会使用缺省值
//void func(int num = 10)  
//{
//	cout << num << endl;
//}
//int main()
//{
//	func(); //因为形参有缺省值，所以可以不传参
//	func(20);//也可以传参，这时会使用传入的参数
//	return 0;
//}

//void func(int num1 = 1, int num2 = 2, int num3 = 3)
//{
//	cout << num1 << " " << num2 << " " << num3 << endl;
//}
//int main()
//{
//	func();
//// 可以只给一个形参
//// C++规定必须从左到右依次给实参
//// 所以这个形参默认是 num1 的
//// num2 和 num3 未传入数据，会使用缺省值
//// 不能跳过num1，直接给num2/num3传参数 
//	func(10);
//// 也可以给两个参数
//// 这时根据规则，10是num1的，20是num2的
//	func(10, 20);
////也可以给三个参数
////即缺省形参可以一部分给实参，一部分不给
////也可以都给，也可以都不给
////但必须从左向右依次给
//	func(10, 20, 30);
//	return 0;
//}

//// 全缺省
//void func(int num1 = 1, int num2 = 2, int num3 = 3)
//{
//	cout << num1 << " " << num2 << " " << num3 << " " << endl;
//}
//// 半缺省
//void func2(int num1, int num2, int num3 = 3)
//{
//	cout << num1 << " " << num2 << " " << num3 << " " << endl;
//}
//int main()
//{
//	//这里只演示半缺省函数的调用
//	// 非缺省的形参必须给值
//	// 缺省的形参可以给，也可以不给
//	func2(10, 20);
//	func2(10, 20, 30);
//	return 0;
//}

//错误示范
//void func(int num1 = 1, int num2, int num3 = 3)
//{
//	cout << num1 << " " << num2 << " " << num3 << " " << endl;
//}
//int main()
//{
//	func(10,20,30);
//	return 0;
//}

// 形参类型不同
//int Add(int left, int right)
//{
//	cout << "int Add(int left, int right)" << endl;
//	return left + right;
//}
//
//double Add(double left, double right)
//{
//	cout << "double Add(double left, double right)" << endl;
//	return left + right;
//}
//
//int main()
//{
//	int ret1 = Add(1, 2);
//	double ret2 = Add(1.1, 2.2);
//	cout << "ret1 = " << ret1 << endl;
//	cout << "ret2 = " << ret2 << endl;
//	return 0;
//}

// 形参个数不同
//void f()
//{
//	cout << "f()" << endl;
//}
//
//void f(int a)
//{
//	cout << "f(int a)" << endl;
//}
//
//int main()
//{
//	f();
//	f(1);
//	return 0;
//}

//void f(int a, char b)
//{
//	cout << "f(int a,char b)" << endl;
//}
//
//void f(char b, int a)
//{
//	cout << "f(char b, int a)" << endl;
//}
//
//int main()
//{
//	f(1, 'a');
//	f('a', 1);
//	return 0;
//}

//void f1()
//{
//	cout << "f()" << endl;
//}
//
//void f1(int a = 10)
//{
//	cout << "f(int a)" << endl;
//}
//int main()
//{
//	// 调用歧义
//	f1();
//	return 0;
//}

//int main()
//{
//	int a = 0;
//	// 引⽤：b和c是a的别名 
//	int& b = a;
//	int& c = a;
//	// 也可以给别名b取别名，d相当于还是a的别名 
//	int& d = b;
//	++d;
//	// 这⾥取地址我们看到是⼀样的 
//	cout << &a << endl;
//	cout << &b << endl;
//	cout << &c << endl;
//	cout << &d << endl;
//	// 它们的值也是相同的
//	cout << a << " " << b << " " << c << " " << d << endl;
//	return 0;
//}

//int main()
//{
//	int a = 10;
//
//	int& b = a;
//	int& c = a;
//
//	cout << a << " " << b << " " << c << " " << endl;
//	return 0;
//}

//int main()
//{
//	int a = 10;
//	cout << a << endl;
//	int& b = a;
//	int c = 20;
//// 引用一旦引用一个实体后，就不能改变指向
//// 所以这里不是让 b 引用 c 
//// 这里是赋值
//	b = c;
//	cout << a << " " << b << endl;
//	cout << c << endl;
//	return 0;
//}

////这里演示通过引用传参来让形参影响实参
////假设不允许通过返回值接受结果
//void add(int num1, int num2, int& ret)
//{
//	ret = num1 + num2;
//}
//int main()
//{
//	int num = 0;
//	add(1, 2, num);
//	cout << num << endl;
//	return 0;
//}

//void Swap(int& rx, int& ry)
//{
//	int tmp = rx;
//	rx = ry;
//	ry = tmp;
//}
//
//int main()
//{
//	int x = 0, y = 1;
//	cout << x << " " << y << endl;
//	Swap(x, y);
//	cout << x << " " << y << endl;
//	return 0;
//}

//int main()
//{
//	const int a = 10;
//	//这样是可以的
//	const int& ra = a;
//	return 0;
////}

//int main()
//{
//	int b = 10;
//	const int& rb = b;
//	b++;
//	//rb++;
//	cout << rb << endl;
//	return 0;
//}

//int main()
//{
//	int a = 10;
//	const int& ra = a * 3;
//
//	double d = 13.14;
//	const int& rd = d;
//	return 0;
//}

//#ifndef NULL
//
//#ifdef __cplusplus
//
//#define NULL 0
//
//#else
//
//#define NULL ((void *)0)
//
//#endif
//
//#endif

//void func(int* x)
//{
//	cout << "int * " << endl;
//}
//
//void func(int x)
//{
//	cout << "int" << endl;
//}
//
//int main()
//{
//	func(NULL);
//	return 0;
//}


